package com.jsejtman.gastos.persistence.entity;

import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
 * Categoria del gasto.
 * 
 * @author jsejtman
 * 
 */
@Entity
@Table(name = "CATEGORIAS")
public class Categoria implements Identifiable<Long> {

	/**
	 * Identificador.
	 */
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id")
	private Long id;
	/**
	 * Descripción.
	 */
	@Column(name = "DESCRIPCION", unique = true, nullable = false)
	private String descripcion;
	/**
	 * Gastos de la categoría.
	 */
	@ElementCollection(targetClass = Gasto.class, fetch = FetchType.LAZY)
	private Set<Gasto> gastos;
	/**
	 * Lugares de la categoría.
	 */
	@OneToMany(mappedBy = "categoria", fetch = FetchType.LAZY, cascade = CascadeType.ALL,
	           orphanRemoval = false)
	private Set<Lugar> lugares;

	/**
	 * @return the id
	 */
	public final Long getId() {

		return this.id;
	}

	/**
	 * @param id the id to set
	 */
	protected final void setId(final Long id) {

		this.id = id;
	}

	/**
	 * @return the descripcion
	 */
	public final String getDescripcion() {

		return this.descripcion;
	}

	/**
	 * @param descripcion the descripcion to set
	 */
	public final void setDescripcion(final String descripcion) {

		this.descripcion = descripcion;
	}

	/**
	 * @return the gastos
	 */
	public final Set<Gasto> getGastos() {

		return this.gastos;
	}

	/**
	 * Setter de gastos.
	 * 
	 * @param gastos the gastos to set
	 */
	protected final void setGastos(final Set<Gasto> gastos) {

		this.gastos = gastos;
	}

	/**
	 * Agrega un gasto.
	 * 
	 * @param gasto el gasto.
	 */
	public final void addGasto(final Gasto gasto) {

		if (this.gastos == null) {
			this.gastos = new HashSet<Gasto>();
		}
		this.gastos.add(gasto);
		gasto.setCategoria(this);
	}

	/**
	 * @return the lugares
	 */
	public final Set<Lugar> getLugares() {

		return this.lugares;
	}

	/**
	 * Setter de lugastes.
	 * 
	 * @param lugares the lugares to set
	 */
	protected final void setLugares(final Set<Lugar> lugares) {

		this.lugares = lugares;
	}

	/**
	 * Agrega un lugar.
	 * 
	 * @param lugar el lugar.
	 */
	public final void addLugar(final Lugar lugar) {

		if (this.lugares == null) {
			this.lugares = new HashSet<Lugar>();
		}
		this.lugares.add(lugar);
		lugar.setCategoria(this);
	}

}
